Introduction au langage JAVA
1. Généralités
1.1. Présentation
Le langage Java fut développé par James
Gosling chez Sun Microsystems en 1991. Depuis l'apparition du WEB
en 1993, le langage Java connaît un essor considérable.
·
Java est un langage interprété et non compilé : les
instructions Java Virtual Machine sont traduites lors de leur
exécution en instructions natives de la machine.
Supposons que sur un des ordinateurs existe un
programme qui devra être exécuté sur les trois autres. On devra
alors non pas télécharger le fichier exécutable mais le fichier
source et le recompiler sur chaque machine avant exécution.
Mais si le programme est écrit en Java il suffit que chaque machine
télécharge le même fichier pré-compilé (___.class qu'on appelle
Bytecode file) et qu'elle le passe à son interpréteur Java qui se
charge alors du bon fonctionnement du programme.
En effet, Java repose sur une machine
virtuelle qu'on appelle Java Virtual Machine (JVM). Le fichier
source Java (extension .java) est pré-compilé en un fichier binaire
(extension .class) exécutable sur la machine virtuelle Java. La
machine virtuelle se charge alors de transformer les instructions
JVM en des instructions natives de la plate-forme.
Programmation
"classique"
programme
source
programme exécutable
compilation
= Exécution du ___.exe
_____.c
_____.cpp
______.exe
Programmation
JAVA
programme
source
programme interprétable (bytecode)
pré-compilation
= Interprétation sur la
Machine Virtuelle Java
_____.java
_____.class
Avantages :
portabilité
Inconvénients : L'interprétation du
bytecode est un processus plus lent que l'exécution d'un
programme compilé dans le langage du processeur.
·
Java est un langage orienté objet (vu à partir du cours n°2,
dans ce premier cours, les concepts objet ne sont pas étudiés).
·
Java est un langage sécurisé : par exemple en éliminant le
référencement direct de la mémoire, on évite des erreurs graves
pouvant mener à l'arrêt du système.
1.2. Outils Java
De nombreux logiciels permettent de développer
en Java, on peut citer :
NetBeans,
Eclipse, Jbuilder….
Pour exécuter un programme Java, il faut un
pré-compilateur et un interpréteur Java. Les créateurs de Java
fournissent gratuitement le JDK (Java Developpement Kit) qui
consiste en une collection de programmes et de fichiers permettant
de pré-compiler et d'exécuter des programmes Java.
Le kit complet peut être téléchargé à partir du site
www.javasoft.com.
Nous utiliserons le JDK 1.8
Les principaux outils que nous utiliserons
sont :
javac : le pré-compilateur Java
java : l'interpréteur Java
appletviewer : le visualiseur des applets.
Pour écrire un programme Java, il faut
utiliser un éditeur comme Notepad ou UltraEdit si on utilise le jdk
ou l'éditeur fourni avec l'outil de développement (si on utilise un
autre produit que le jdk).
Dans un 2ème temps (vers décembre)
nous étudierons la plateforme Eclipse (version WebTools).
2. Syntaxe du
langage
La syntaxe de java est proche de celle de C++.
Toutefois, il faut préciser que :
@Java ne permet plus de définir des
fonctions et des procédures indépendantes. Elles devront
obligatoirement être définies dans une classe en tant que
méthode.
@Le passage des paramètres par
référence n’existe plus en tant que tel. Il faut pour l’implémenter
, transmettre un tableau du type du paramètre, un tableau étant
traité par Java comme une référence.
@Les chaînes des caractères ne sont
pas traitées comme des tableaux.
@Les types structurés n'existent pas
en tant que tels, il faut créer une classe.
@La syntaxe pour les
entrées/sorties, les fonctions de manipulation de chaînes … est
différente.
@Le type booléen existe en tant que
tel.
2.1. Premier programme Java
·
Ci-dessous figure un premier programme Java :
// Premier
essai
Ligne 1
class
Premier_essai
// Ligne 2
{
// Ligne 3
public static void main(String[]
argv)
// Ligne 4
{
// Ligne 5
System.out.println("Cela
fonctionne");
// Ligne 6
}
// Ligne 7
}
// Ligne 8
La deuxième ligne class Premier_essai
commence par le mot class, qui veut dire que nous allons définir
une nouvelle classe java, suivi du nom de cette classe, qui est
aussi le nom de notre programme. Nous verrons dans un chapitre
ultérieur ce que sont exactement les classes. Retenez pour
l'instant les choses suivantes :
Ø Un programme
comporte au moins une classe.
Ø Cette classe
doit obligatoirement porter le même nom que le fichier dans lequel
le programme est enregistré. Le fichier possède, en plus,
l'extension .java. Donc le programme Java ci-dessus doit
être enregistré dans le fichier Premier_essai.java
La 4ère ligne est
public static
void main(String[] argv)
La partie fondamentale de cette ligne est
void main(). main signifie que nous allons
définir une méthode, ce qui est indiqué entre autres, par les
parenthèses (). Une méthode est une sorte de procédure ou fonction
appartenant à une classe.
Le type retourné est ici void donc "rien".
Cette méthode va être en quelque sorte le
point d'entrée dans la classe et devra être présente si on souhaite
que l'utilisateur puisse invoquer la classe.
Dans notre programme, la méthode main
prend un paramètre, dont le nom est argv et le type
String[]. Notre méthode main n'utilise pourtant pas
ce paramètre, mais nous sommes obligés de le faire figurer. Notons
que ce paramètre sera utilisé si on souhaite que le lancement du
programme nécessite un paramètre.
La 6ème ligne affiche le message "Cela
fonctionne".
Remarques : . les symboles pour
les commentaires sont les mêmes qu'en C++.
. le respect de la
casse est impératif comme c'est le cas en C ou C++.
2.2. Types élémentaires
Comme tout langage
de programmation, Java possède ses propres types élémentaires
servant à représenter les données.
Remarque : Dans Java la taille des types élémentaires est la même
sur toutes les plate-formes. Ainsi le programmeur n'aura pas à se
soucier des problèmes qui découlent en général d'un changement de
plate-forme.
Les types
élémentaires ainsi que leurs caractéristiques sont résumés dans le
tableau ci-dessous:
Type
|
Contenu
|
Valeur initiale
|
Bits occupés
|
boolean
|
true ou false
|
false
|
1
|
byte
|
entier signé
|
0
|
8
|
char
|
caractère Unicode
|
\u0000
|
16
|
short
|
entier court signé
|
0
|
16
|
int
|
entier signé
|
0
|
32
|
long
|
entier long signé
|
0
|
64
|
float
|
nombre décimal à virgule
flottante
|
0.0
|
32
|
double
|
nombre décimal à virgule
flottante
|
0.0
|
64
|
Codage des caractères par UNICODE (=> ASCII
sur 128 premiers caractères et les 128 autres pour caractères
spéciaux des divers langages, les suivants étant des symboles
mathématiques, des symboles graphiques …).
Les caractères sont écrits entre ’ alors
’ ’ signifie blanc.
’\uNNNN’ signifie caractère dont la valeur UNICODE est NNNN.
Exemples :
’\u0020’
signifie
blanc.
’\u0041’
signifie
A çè 'A'
’\’’
signifie ’
’\\’
signifie \
Remarque : A la différence de C, la
chaîne de caractères ne se termine pas par ‘\n’.
Attention : Le
type d’un littéral est déterminé de la façon
suivante :
·
Un entier qui se termine par L ou l est
un long, tous les autres sont des int.
·
Un réel qui se termine par F ou f est un
float, les autres sont des double.
2.3. Les identificateurs
Ils doivent :
Ø Commencer par
une lettre de l’alphabet, une lettre accentuée ou _ ou $
Ø Comporter des
lettres de l'alphabet, des lettres accentuées, des chiffres, le _
ou le $.
Exemple : garçon, maïs,...
(Attention pas dans tous les JAVA)
2.4. La déclaration des
variables
Syntaxe : type
ident ;
// déclare une variable
ou type ident =
valeur ;
// déclare une variable et donne une valeur initiale ;
Exemple de
définition et d'affectation d’une variable
int valeur;
// instruction quelconque
valeur=3;
La portée d'une
variable est par définition la partie du code où cette variable est
visible. Dans Java une variable n'est visible qu'à l'intérieur du
bloc entre accolades dans lequel elle est déclarée et également
dans les blocs qui y sont imbriqués.
2.5. Principaux opérateurs
Dans l’ordre de priorité :
1. [ ]
() signes + et -
2.
++ -- ! (négation)
instanceof
3.
* / %
4. +
-
5.
< > <= >=
6. ==
(égalité) != (différence)
7.
&&
8.
||
9.
? : (boolexpr) ? expr1 : expr2
10. = (affectation)
ainsi que += *=…....
11. , (virgule,
cf 2 instructions dans la partie initialisation ou dans la partie
progression de la boucle for)
L'opérateur de concaténation des chaînes est
+
Comme en C :
mat = ++ nombre est <> de mat = nombre + 1. En
effet dans le 1er cas on augmente la valeur de nombre
puis on attribue la valeur de nombre à mat.
dans le 2ème cas, on attribue nombre + 1 à mat, mais
nombre reste inchangé.
int x = 5 ; int y =
x++ è à l'issue de ces 2
affectations, x=6 et y=5.
2.6. Le transtypage ou casting
ou promotion
Exemple : // convertir ce décimal en
entier
int entier = (int) flottant ;
promotion : la conversion peut
être omise exemple : long ß int
l’inverse est accepté mais le type est
obligatoire
int ß (int) long
Exemples :
int
i;
long
l;
i =
15;
l =
i;
l =
5000;
i = (int)
l;
2.7. Les chaînes de
caractères
En Java, les chaînes
de caractères sont définies à l’aide du mot clé String (String est
une classe) suivi du nom de variable. A la différence du C, elles
ne sont pas une application particulière des tableaux et ne se
terminent pas par le caractère nul ('\u0000').
Les variables chaînes de caractères peuvent
être initialisées directement avec une chaîne de caractères.
Exemple :
|
String chaine1 = "Bonjour";
String chaine2;
chaine2 = "Bonsoir";
|
Attention :
String commence par une majuscule.
Les fonctions de manipulation de chaînes
seront étudiées ultérieurement.
2.8.Les instructions
conditionnelles
Idem langage C
L'instruction SI
if (boolexpr)
{
// instructions
}
else
{
// instructions
}
Remarques :
·
Le else est bien sûr facultatif.
·
Plusieurs instructions if...else peuvent
être imbriquées les unes dans les autres.
·
Il est à noter que comme en C, pour une instruction unique
dépendant d’une condition, aucune accolade n’est obligatoire.
Exemple :
|
if
(température>28)
System.out.println ("Il fait très chaud");
else
if (température > 10)
System.out.println ("Il ne fait ni trop chaud ni trop
frais");
else
System.out.println ("Il fait frais");
|
L'instruction de choix
switch
(expr)
exemple : switch (c)
case
cexpr1 :
case '0' : case '1' :
case
cexpr2 :
case '2' :
//
instructions
…
_fichiers/image006.gif)
default :
…
//
instructions
}
}
2.9. Les instructions
d’itération
Idem langage
C
Boucles tant
que
Boucles jusqu'à
while
(boolexpr)
do
//
instructions
// instructions
}
}
while (boolexpr)
Boucles pour :
for
(instruction(s)_initialisation; boolexpr;
instruction(s)_progression)
{
// instructions;
}
Exemple:
for (int i
= 0 ; i < tailletable ; i++)
{
table[i] = 0 ;
Remarque :
@Pour une instruction unique
dépendant d’une condition de boucle, aucune accolade n’est
obligatoire.
@Le corps de la boucle for n'est pas
obligatoire.
@Il est possible (mais pas forcément
conseillé) d'utiliser la commande break pour sortir de la
boucle.
2.10.
Les entrées/sorties
Les
sorties
Nous avons déjà utilisé
System.out.println.
out représente le flux de sortie
standard.
Exemple de sortie standard(affichage) :
System.out.println("Bonjour"); // Affichage puis
passage au début de la ligne suivante
System.out.print("Bonjour"); // Affichage non suivi du
passage au début de la ligne suivante
println est une méthode qui prend un
paramètre de type chaîne de caractères et affiche sa valeur sur la
sortie standard. Cette méthode s'applique sur l'objet out,
qui lui-même appartient à la classe System.
Nous avons vu que le
caractère "\" permet de signaler les caractères spéciaux. Pour la
mise en forme, on peut utiliser le passage à la ligne "\n" et la
tabulation "\t".
Exemple :
System.out.println("\nLe silence est d'or");
Les chaînes de caractères Java peuvent être
concaténées avec l'opérateur
+ , en fait toute variable (même d'un type autre que
String) peut être concaténée à une autre variable pour former une
chaîne dans une instruction d'affichage ou autre.
Exemples
:
int i = 10, j=3;
System.out.println("Numéro = " + i);
System.out.println("Numéro = " + i + j);
System.out.println(i+j);
Les
entrées
in représente le flux d'entrée standard
du système.
Exemple d’entrée standard :
import
java.io.*;
class saisies
{
public static void main(String args[]) throws
IOException
{
BufferedReader rep = new BufferedReader(new
inputStreamReader(System.in));
…
String valeur = rep.readLine() ;
System.out.println("Voici la chaîne
saisie : "+valeur);
}
}
Pour utiliser la classe BufferedReader qui est
nécessaire pour la lecture du flux d'entrée, il faut inclure
java.io.* et il faut renvoyer les exceptions (tout ceci n'est pas
utile pour l'utilisation du flux de sortie).
On a effectué la déclaration d’un nouveau
buffer d’entrée nommé rep et la saisie d’une chaîne par
rep.readLine().
On peut convertir ce qui est saisi en entier,
en byte, en entier court, en entier long, en réel simple précision,
en réel double précision ou en caractère.
int i =
Integer.parseInt(rep.readLine());
byte b =
Byte.parseByte(rep.readLine());
short s =
Short.parseShort(rep.readLine());
long l =
Long.parseLong(rep.readLine());
float f =
Float.parseFloat(rep.readLine());
double d =
Double.parseDouble(rep.readLine());
String valeur
= rep.readLine() ;
char c =
valeur.charAt(0);
remarques :
Bien sûr, si la valeur saisie n'est pas du
type attendu, cela "plante" le programme. Nous verrons plus
tard comment procéder pour effectuer les contrôles de type à la
saisie.
Pour éviter d'utiliser ce bloc d'instructions
quelque peu complexes on construira et on utilisera une classe
Entrée.